package top.lixunda.ecommerce.server.good.api.controller;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.*;
import top.lixunda.commerce.common.core.entity.MessageObject;
import top.lixunda.ecommerce.server.good.api.entity.db.GoodOrderDO;
import top.lixunda.ecommerce.server.good.api.entity.dto.DeliverGoodChangeDTO;
import top.lixunda.ecommerce.server.good.api.entity.dto.DeliverGoodDTO;
import top.lixunda.ecommerce.server.good.api.entity.vo.OrderDistinguishVO;
import top.lixunda.ecommerce.server.good.api.entity.vo.OrderTranceVO;

import java.util.List;

/**
 * 商家发货相关操作
 *
 * @author lixunda
 * @version time:2020/3/5 15:29
 */
@SuppressWarnings("unused")
@Api("商家发货相关操作")
@RequestMapping("/good_deliver")
public interface IGoodDeliverController {

    /**
     * 对某个订单进行发货
     *
     * @param deliverGoodList 发货相关信息，包括物流信息
     * @return 返回订单发货后的订单基本信息
     */
    @ApiOperation("用户调用，根据id获取商品数据,只能查询普通用户可见的商品信息")
    @PostMapping("/deliverGoodByOrderIds")
    MessageObject<List<GoodOrderDO>> deliverGoodByOrderIds(@RequestBody List<DeliverGoodDTO> deliverGoodList);

    /**
     * 修改发货后的订单发货信息
     *
     * @param deliverGoodChangeList 发货相关信息，包括物流信息
     * @return 返回订单发货后的订单基本信息
     */
    @ApiOperation("用户调用，根据id获取商品数据,只能查询普通用户可见的商品信息")
    @PostMapping("/changeDeliverGoodByOrderIds")
    MessageObject<List<GoodOrderDO>> changeDeliverGoodByOrderIds(@RequestBody List<DeliverGoodChangeDTO> deliverGoodChangeList);

    /**
     * 根据订单id取消发货信息
     *
     * @param orderIds 订单id
     * @return 是否取消成功
     */
    @ApiOperation("根据订单id取消发货信息")
    @PostMapping("/cancelDeliverByOrderIds")
    MessageObject<Boolean> cancelDeliverByOrderIds(@RequestBody List<Integer> orderIds);

    /**
     * 物流订单号识别
     *
     * @param code 物流订单号
     * @return 识别信息，可能多个
     */
    @ApiOperation("物流订单号识别")
    @GetMapping("/orderDistinguish")
    MessageObject<List<OrderDistinguishVO>> orderDistinguish(@RequestParam("code") String code);

    /**
     * 用户调用，根据订单号查询物流信息
     *
     * @param orderId 订单id
     * @return 物流信息
     */
    @ApiOperation("用户调用，根据订单号查询物流信息")
    @GetMapping("/queryTranceByOrderIdUser")
    MessageObject<OrderTranceVO> queryTranceByOrderIdUser(@RequestParam("orderId") Integer orderId);

    /**
     * 商铺用户调用，根据订单号查询物流信息
     *
     * @param orderId 订单id
     * @return 物流信息
     */
    @ApiOperation("商铺用户调用，根据订单号查询物流信息")
    @GetMapping("/queryTranceByOrderIdStore")
    MessageObject<OrderTranceVO> queryTranceByOrderIdStore(@RequestParam("orderId") Integer orderId);

    /**
     * 管理员用户调用，根据订单号查询物流信息
     *
     * @param orderId 订单id
     * @return 物流信息
     */
    @ApiOperation("管理员用户调用，根据订单号查询物流信息")
    @GetMapping("/queryTranceByOrderIdAdmin")
    MessageObject<OrderTranceVO> queryTranceByOrderIdAdmin(@RequestParam("orderId") Integer orderId);

    /**
     * 用户调用，根据订单号收货
     *
     * @param orderId 订单id
     * @return 收货是否成功
     */
    @ApiOperation("用户调用，根据订单号收货")
    @GetMapping("/takeDeliveryByOrderId")
    MessageObject<Boolean> takeDeliveryByOrderId(@RequestParam("orderId") Integer orderId);

    /**
     * 用户调用，根据订单号收货，批量处理
     *
     * @param orderIds 订单id
     * @return 收货是否成功
     */
    @ApiOperation("用户调用，根据订单号收货")
    @PostMapping("/takeDeliveryByOrderId")
    MessageObject<Boolean> takeDeliveryByOrderIds(@RequestBody List<Integer> orderIds);

}
